package services.producto;

import java.util.ArrayList;
import java.util.List;

import org.springframework.transaction.annotation.Transactional;

import util.assembly.ProductoAssembly;
import bo.PersistentObject;
import bo.Producto;
import dao.ProductoDAO;
import dto.ProductoDTO;
import dto.SearchDTO;
import exceptions.CannotDeleteException;
import exceptions.CannotSaveException;

public class ProductoService {
	
	ProductoDAO productoDAO;
	
	/**
	 * Guarda un producto
	 * @param productoDTO	DTO de producto
	 */
	@Transactional
	public String save(ProductoDTO productoDTO) throws CannotSaveException {
		
		Producto producto = ProductoAssembly.toBO(productoDTO);
		
		String id = productoDAO.save(producto);
		if (id == null) {
			throw new CannotSaveException();
		}
		return id;
	}

	@Transactional
	public Object merge(ProductoDTO productoDTO) throws CannotSaveException {
		
		Producto producto = ProductoAssembly.toBO(productoDTO);
		
		Object e = productoDAO.merge(producto);
		if (e == null) {
			throw new CannotSaveException();
		}
		return e;
	}
	
	
	/**
	 * Borra un producto
	 * @param id	ID del producto a borrar
	 * @throws CannotDeleteException
	 */
	@Transactional
	public void delete(String id) throws CannotDeleteException {
		
		Producto producto = productoDAO.findById(id);
		
		productoDAO.delete(producto);
	}
	
	
	@Transactional
	public void update(ProductoDTO productoDTO) {
		
		Producto producto = ProductoAssembly.toBO(productoDTO);
		productoDAO.update(producto);
	}
	
	
	@Transactional
	public List<ProductoDTO> search(SearchDTO searchDTO) {
		
		List<ProductoDTO> lista = new ArrayList<ProductoDTO>();
		
		List<PersistentObject> productos = productoDAO.search(Producto.class, searchDTO);
		for (PersistentObject persistentObject : productos) {
			lista.add(ProductoAssembly.toDTO((Producto)persistentObject));
		}
		return lista;
	}
	
	
	
	/**
	 * Obtiene todos los producots
	 * @return	la lista de productos
	 */
	@Transactional
	public List<ProductoDTO> findAll() {
		
		List<ProductoDTO> lista = new ArrayList<ProductoDTO>();
		
		List<PersistentObject> productos = productoDAO.findAll();
		for (PersistentObject persistentObject : productos) {
			lista.add(ProductoAssembly.toDTO((Producto)persistentObject));
		}
		return lista;
	}
	
	/**
	 * Obtiene un producto segun ID
	 * @param id	el ID
	 * @return el producto
	 */
	@Transactional
	public ProductoDTO findById(String id) {
		
		Producto producto = productoDAO.findById(id);
		ProductoDTO productoDTO = ProductoAssembly.toDTO(producto);
		return productoDTO;
	}
	

	public ProductoDAO getProductoDAO() {
		return productoDAO;
	}

	public void setProductoDAO(ProductoDAO productoDAO) {
		this.productoDAO = productoDAO;
	}
	
}
